﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AudioBook.AudioManagement.Util
{
    //Đọc một ký tự
    public class ReadNumber
    {
        private static string readALetter(string letter)
        {
            switch (letter)
            {
                case "0": return "không ";
                case "1": return "một ";
                case "2": return "hai ";
                case "3": return "ba ";
                case "4": return "bốn ";
                case "5": return "năm ";
                case "6": return "sáu ";
                case "7": return "bảy ";
                case "8": return "tám ";
                case "9": return "chín ";
            }
            return "";
        }

        //Đọc hai ký tự
        private static string readTwoLetter(string letter)
        {
            if (letter == "00")
            {
                return "";
            }

            if (letter[0].ToString() == "0")
            {
                return "lẻ " + readALetter(letter[1].ToString());
            }

            if (letter[0].ToString() == "1")
            {
                if (letter[1].ToString() == "0")
                {
                    return "mười ";
                }
                return "mười " + readALetter(letter[1].ToString());
            }

            if (letter[1].ToString() == "0")
            {
                if (letter[0].ToString() == "1")
                {
                    return "mười ";
                }
                return readALetter(letter[0].ToString()) + "mươi ";
            }

            if (letter[1].ToString() == "1")
            {
                return readALetter(letter[0].ToString()) + "mươi mốt ";
            }

            return readALetter(letter[0].ToString()) + "mươi " + readALetter(letter[1].ToString());
        }

        //Đọc 3 ký tự
        private static string readThreeLetter(string letter)
        {
            return readALetter(letter[0].ToString()) + "trăm " + readTwoLetter(letter.Substring(1, 2));
        }




        //Đọc một xâu chuyển từ một số nguyên
        private static string readIntNumber(string number)
        {
            try
            {
                int tg;
                for (int j = 0; j < number.Length; j++)
                {
                    if (number[j].ToString() == "-")
                    {
                        break;
                    }
                    tg = Convert.ToInt16(number[j].ToString());
                }
            }
            catch
            {
                throw new ArithmeticException();
            }
            string[] group ={ "", "nghìn ", "triệu ", "tỷ " };
            string result = "";
            string minus = "";
            if (number[0].ToString() == "-")
            {
                number = number.Substring(1);
                minus = "âm ";
            }
            int i = 0;
            while (number != "")
            {
                int len = Math.Min(3, number.Length); //Số ký tự sẽ đọc
                string sub = number.Substring(number.Length - len, len);
                switch (len)
                {
                    case 1:
                        result = readALetter(sub) + group[i] + result;
                        break;
                    case 2:
                        result = readTwoLetter(sub) + group[i] + result;
                        break;
                    case 3:
                        if (sub == "000")
                        {
                            if (i == 3)
                            {
                                i = 0;
                                result = "tỷ " + result;
                            }
                            break;
                        }
                        result = readThreeLetter(sub) + group[i] + result;
                        break;
                }
                i = (i + 1) % 4;

                number = number.Substring(0, number.Length - len);//Số ký tự còn lại
            }
            return minus + result;
        }

        //Đọc một xâu là chuyển đổi của số thập phân
        static string readDoubleNumber(string number)
        {
            string dot = ".";
            string number1;
            string number2;
            int pos = number.IndexOf(dot);
            if (pos == -1)
            {
                return readIntNumber(number);
            }
            number1 = number.Substring(0, pos);
            number2 = number.Substring(pos + 1);
            return readIntNumber(number1) + "phảy " + readIntNumber(number2);
        }

        //Đọc số nguyên
        public static string Read(int number)
        {
            string str;
            string result;
            str = number.ToString();
            result= readIntNumber(str);
            if ((str.Length > 3) && (str.Substring(str.Length - 3, 3) == "000"))
                result = result + "chẵn ";
            return result;
        }

        //Đọc số thập phân
        public static string Read(double number)
        {
            string str;
            string result;
            str = number.ToString();
            result = readDoubleNumber(str);
            if ((str.Length > 3) && (str.Substring(str.Length - 3, 3) == "000"))
                result = result + "chẵn ";
            return result;
        }

        //Đọc một xâu
        public static string Read(string number)
        {
            string dot = ".";
            string number1;
            string number2;
            string minus="";
            string result;
            if (number[0].ToString() == "-")
            {
                number = number.Substring(1);
                minus = "âm ";
            }
            int pos = number.IndexOf(dot);
            if (pos != -1)
            {
                number1 = number.Substring(0, pos);
                number2 = number.Substring(pos + 1);
                while ((number1[0].ToString() == "0") & (number1.Length > 1))
                {
                    number1 = number1.Substring(1);
                }

                while (number2[number2.Length - 1].ToString() == "0" & (number2.Length>1))
                {
                    number2 = number2.Substring(0, number2.Length - 1);
                }

                if ((number2 == "") | (number2=="0"))
                {
                    result= readIntNumber(number1);
                    if ((number1.Length > 3) && (number1.Substring(number1.Length - 3, 3) == "000"))
                        result = result + "chẵn ";
                    result = minus + result;
                    return result;
                }
                else
                {
                    number = number1 + "." + number2;
                    return  (minus+ readDoubleNumber(number));
                }
            }
            else
            {
                while ((number[0].ToString()) == "0" & (number.Length > 1))
                {
                    number = number.Substring(1, number.Length - 1);
                }
                result= readIntNumber(number);
                if ((number.Length > 3) && (number.Substring(number.Length - 3, 3) == "000"))
                    result = result + "chẵn ";
                result = minus + result;
                return result;

            }
        }

        //Thêm các dấu ' vào số
        public  static string InsertComLetters(string number)
        {
            string dot = ".";
            string number1;
            string number2;
            string result;

            //Chuan hoa
            int pos = number.IndexOf(dot);
            if (pos != -1)
            {
                number1 = number.Substring(0, pos);
                number2 = number.Substring(pos + 1);
                while ((number2.Length > 1) && number2[number2.Length - 1].ToString() == "0")
                {
                    number2 = number2.Substring(0, number2.Length - 1);
                }
            }
            else
            {
                number1 = number;
                number2 = "";
            }
            int i = number1.Length - 3;
            while (i > 0)
            {
                number1 = number1.Insert(i, ",");
                i = i - 3;
            }

            i = number2.Length - 3;
            while (i > 0)
            {
                number2 = number2.Insert(i, ",");
                i = i - 3;
            }
            if (number2 == "0")
                number2 = "";
            if (number2 != "")
                result = number1 + "." + number2;
            else
                result = number1;
            return result;
        }
    }
}

